with Interfaces.C; use Interfaces.C;
with SDL_stdinc_h;
with System;

package SDL_timer_h is


  SDL_TIMESLICE : constant := 10;  --  SDL_timer.h:38

  TIMER_RESOLUTION : constant := 10;  --  SDL_timer.h:41

  --    SDL - Simple DirectMedia Layer
  --    Copyright (C) 1997-2006 Sam Lantinga
  --    This library is free software; you can redistribute it and/or
  --    modify it under the terms of the GNU Lesser General Public
  --    License as published by the Free Software Foundation; either
  --    version 2.1 of the License, or (at your option) any later version.
  --    This library is distributed in the hope that it will be useful,
  --    but WITHOUT ANY WARRANTY; without even the implied warranty of
  --    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  --    Lesser General Public License for more details.
  --    You should have received a copy of the GNU Lesser General Public
  --    License along with this library; if not, write to the Free Software
  --    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  --    Sam Lantinga
  --    slouken@libsdl.org
  -- 

  -- Header for the SDL time management routines  
  -- Set up for C function definitions, even when using C++  
  -- This is the OS scheduler timeslice, in milliseconds  
  -- This is the maximum resolution of the SDL timer on all platforms  
  -- Get the number of milliseconds since the SDL library initialization.
  -- * Note that this value wraps if the program runs for more than ~49 days.
  --  

   function SDL_GetTicks return SDL_stdinc_h.Uint32;  -- SDL_timer.h:46:49
   pragma Import (C, SDL_GetTicks, "SDL_GetTicks");

  -- Wait a specified number of milliseconds before returning  
   procedure SDL_Delay (ms : SDL_stdinc_h.Uint32);  -- SDL_timer.h:49:49
   pragma Import (C, SDL_Delay, "SDL_Delay");

  -- Function prototype for the timer callback function  
   type SDL_TimerCallback is access function (arg1 : SDL_stdinc_h.Uint32) return SDL_stdinc_h.Uint32;  -- SDL_timer.h:52:60

  -- Set a callback to run after the specified number of milliseconds has
  -- * elapsed. The callback function is passed the current timer interval
  -- * and returns the next timer interval.  If the returned value is the 
  -- * same as the one passed in, the periodic alarm continues, otherwise a
  -- * new alarm is scheduled.  If the callback returns 0, the periodic alarm
  -- * is cancelled.
  -- *
  -- * To cancel a currently running timer, call SDL_SetTimer(0, NULL);
  -- *
  -- * The timer callback function may run in a different thread than your
  -- * main code, and so shouldn't call any functions from within itself.
  -- *
  -- * The maximum resolution of this timer is 10 ms, which means that if
  -- * you request a 16 ms timer, your callback will run approximately 20 ms
  -- * later on an unloaded system.  If you wanted to set a flag signaling
  -- * a frame update at 30 frames per second (every 33 ms), you might set a 
  -- * timer for 30 ms:
  -- *   SDL_SetTimer((33/10)*10, flag_update);
  -- *
  -- * If you use this function, you need to pass SDL_INIT_TIMER to SDL_Init().
  -- *
  -- * Under UNIX, you should not use raise or use SIGALRM and this function
  -- * in the same program, as it is implemented using setitimer().  You also
  -- * should not use this function in multi-threaded applications as signals
  -- * to multi-threaded apps have undefined behavior in some implementations.
  -- *
  -- * This function returns 0 if successful, or -1 if there was an error.
  --  

   function SDL_SetTimer (interval : SDL_stdinc_h.Uint32; callback : access function (arg1 : SDL_stdinc_h.Uint32) return SDL_stdinc_h.Uint32) return int;  -- SDL_timer.h:82:85
   pragma Import (C, SDL_SetTimer, "SDL_SetTimer");

  -- New timer API, supports multiple timers
  -- * Written by Stephane Peter <megastep@lokigames.com>
  --  

  -- Function prototype for the new timer callback function.
  -- * The callback function is passed the current timer interval and returns
  -- * the next timer interval.  If the returned value is the same as the one
  -- * passed in, the periodic alarm continues, otherwise a new alarm is
  -- * scheduled.  If the callback returns 0, the periodic alarm is cancelled.
  --  

   type SDL_NewTimerCallback is access function (arg1 : SDL_stdinc_h.Uint32; arg2 : System.Address) return SDL_stdinc_h.Uint32;  -- SDL_timer.h:94:76

  -- Definition of the timer ID type  
   --  skipped empty struct u_SDL_TimerID

   type SDL_TimerID is new System.Address;  -- SDL_timer.h:97:30

  -- Add a new timer to the pool of timers already running.
  --   Returns a timer ID, or NULL when an error occurs.
  --  

   function SDL_AddTimer
     (interval : SDL_stdinc_h.Uint32;
      callback : access function (arg1 : SDL_stdinc_h.Uint32; arg2 : System.Address) return SDL_stdinc_h.Uint32;
      param : System.Address) return SDL_TimerID;  -- SDL_timer.h:102:109
   pragma Import (C, SDL_AddTimer, "SDL_AddTimer");

  -- Remove one of the multiple timers knowing its ID.
  -- * Returns a boolean value indicating success.
  --  

   function SDL_RemoveTimer (t : SDL_TimerID) return SDL_stdinc_h.SDL_bool;  -- SDL_timer.h:107:63
   pragma Import (C, SDL_RemoveTimer, "SDL_RemoveTimer");

  -- Ends C function definitions when using C++  
end SDL_timer_h;
